﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<stdlib.h>

//二维数组

//创建
//int main ()
//{
//	char ch[5][8];
//	float math[5][8];
//	return 0;
//
//}

//int main()
//{
//	//int date[3][5] = { 1,2,3 };
//	//int date[3][5] = { 1,2,3,4,5,6,7,8,9,1,2,3 };
//	//int date[3][5] = { {1,2,3},{2,5},{6,8,9,5} };//指定行来初始化
//	
//	int arr5[][5] = { 1,2,3 };//一行
//	int arr6[][5] = { 1,2,3,4,5,6,7 };//两行
//	int arr7[][5] = { {1,2},{5,2,4},{5,6} };//三行
//	return 0;
//}

//使用F10来调试运行
//第一行先填入，第一行填满之后再填第二行，没有数字之后用0填满
//也可以按照行来初始化，用{}来括住每一行的内容
//初始化时，行可以省略，但是列不可以省略，会根据后面所给的数来确定行数


//int main()
//{
//	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
//	printf("%d\n", arr[1][3]);
//	return 0;
//}

//int main()
//{
//	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
//	int i = 0;
//	int j = 0;
//	//输入值
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 5; j++)
//		{
//			printf("请输入arr[%d]{%d}的值：", i, j);
//			scanf("%d",  &arr[i][j]);
//		}
//	}
//	//打印所有元素
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 5; j++) 
//		{
//			printf("arr[% d][% d] = %d\t", i, j, arr[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}

//int main()
//{
//	int arr[3][5] = { 0 };
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 5; j++)
//		{
//			printf("&arr[%d][%d]=%p\n", i, j, &arr[i][j]);
//		}
//	}
//	return 0;
//}

//&arr[0][0]=00EFFE5C
//&arr[0][1] = 00EFFE60
//& arr[0][2] = 00EFFE64
//& arr[0][3] = 00EFFE68
//& arr[0][4] = 00EFFE6C
//& arr[1][0] = 00EFFE70
//& arr[1][1] = 00EFFE74
//& arr[1][2] = 00EFFE78
//& arr[1][3] = 00EFFE7C
//& arr[1][4] = 00EFFE80
//& arr[2][0] = 00EFFE84
//& arr[2][1] = 00EFFE88
//& arr[2][2] = 00EFFE8C
//& arr[2][3] = 00EFFE90
//& arr[2][4] = 00EFFE94

//每⼀⾏内部的每个元素都是相邻的，地址之间相差4个字节，
// 跨⾏位置处的两个元素之间也是差4个字节
//所以⼆维数组中的每个元素都是连续存放的

//C99之前数组的大小只能使用常量或者常量表达式来指定
//在C99中引入了变长数组的概念，这是创建数组的时候可以使用变量来指定大小
//但是VS中不支持变长数组
//变长数组的意思是数组的大小可以使用变量指定，但是一旦创建后，大小就无法改变了
//变长数组不能初始化
// 
// 
////数组练习
////多个字符从两端移动，向中间汇聚 
//
//
////打印welcome to bit!!!
////w***************!
////we*************!!
////wel***********!!!
////welc*********t!!!
////welco*******it!!!
////welcom*****bit!!!
////welcome*** bit!!!
////welcome *o bit!!!
////welcome to bit!!!
//
//
//int main()
//{
//	char arr[] = "abc";
//	char arr1[] = "welcome to bit!!!";
//	char arr2[] = "*****************";
//
//	int left = 0;
//	int right = strlen(arr1)-1;//#include<string.h>
//	
//	while (left<=right)
//	{
//		arr2[left] = arr1[left];
//		arr2[right] = arr1[right];
//		printf("%s\n", arr2);
//		Sleep(1000);//单位是毫秒//#include<windows.h>
//		system("cls");//清理屏幕上信息//#include<stdlib.h>
//		left++;
//		right--;
//	}
//	printf("%s\n", arr2);
//	return 0;
//}

//int main()
//{
//	char arr[] = "abcdef";//[a b c d e f \0]
//	//                       0 1 2 3 4 5 6
//	//                       
//	int right1 = strlen(arr) - 1;
//	int right2 = sizeof(arr) / sizeof(arr[0]) - 2;
//	printf("%d\n", right1);//5
//	printf("%d\n", right2);//5
//
//	return 0;
//}
//strlen 计算的值\0之前的字符个数

//二分查找
//使用场景：在   有序    的数据中查找某个数
// 有序  有序   有序
// 
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int k = 7;//在数组中查找7
//
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int flag = 0;
//	for (i = 0; i < sz; i++)
//	{
//		if (k == arr[i])
//		{
//			printf("找到了，下标是：%d", i);
//			flag = 1;
//			break;
//		}
//	}
//	if (flag == 0)
//	{
//		printf("找不到了\n");
//	}
//	return 0;
//}



//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int k = 7;//在数组中查找7
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int flag = 0;
//
//	int left = 0;//左下标
//	int right = sz - 1;//右下标
//
//	while (left<=right)
//	{
//		int mid = (left + right) / 2;//中间元素的下标
//		if (arr[mid] < k)
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > k)
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			flag = 1;
//			printf("找到了，下标是%d\n", mid);
//			break;
//		}
//	}
//	if (flag == 0)
//	{
//		printf("找不到了\n");
//	}
//	return 0;
//}

//找出数组中中间元素  
//计算出中间元素的下标
//查找范围左右下标平均值----》中间元素的下标
//二分查找  有序  有序  有序
 
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int k = 0;//在数组中查找输入的数
//	printf("请输入你要找的数字：");
//	scanf("%d", &k);
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
// 
//	int flag = 0;
//
//	int left = 0;//左下标
//	int right = sz - 1;//右下标
//
//	while (left <= right)
//	{
//		int mid = left/2+right/2;//中间元素的下标//问题出现在这，k=4时找不出来不出来
//		if (arr[mid] < k)
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > k)
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			flag = 1;
//			printf("找到了，下标是%d\n", mid);
//			break;
//		}
//	}
//	if (flag == 0)
//	{
//		printf("找不到了\n");
//	}
//	return 0;
//}



//函数

////C语言中的函数就是一个完成某项特定的任务的一小段代码
////这段代码有特殊的写法和调用方法的
////C语言程序就是由函数组成的
////函数时可以复用的
////C语言中分为两类函数
////库函数    自定义函数
//#include<math.h>
//int main()
//{
//	double d = 16.0;
//	double r = sqrt(d);
//	printf("%lf\n",r);//4.000000
//	return 0;
//}


//#include<stdio.h>
//int main()
//{
//    int i = 0;
//    int j = 0;
//    printf("请输入：");
//    scanf("%d", i)
//        char arr[i - 1][i - 1] = { "0" };
//
//    for (j = 0; j <= i; j++)
//    {
//        printf("*", arr[j][j])
//            printf("*", arr[i - j][i - j]);
//    }
//
//    return 0;
//}
//
//#include<stdio.h>
//int main()
//{
//    int i = 0;
//    int j = 0;
//    printf("请输入：");
//    scanf("%d", &i);
//    char arr[] = "abc";
//
//    for (j = 0; j <= i; j++)
//    {
//        arr[j] = '*';
//        arr[i - j] = '*';
//        for (j = i; i >= 0; i--)
//        {
//            printf("%c", arr[i]);
//        }
//    }
//
//    return 0;
//}